/// fmt::Debug：使用 {:?} 标记。格式化文本以供调试使用。
/// fmt::Display：使用 {} 标记。以更优雅和友好的风格来格式化文本

fn main() {
    println!("格式化参考: https://rustwiki.org/zh-CN/std/fmt/");

    println!("Hello, world!"); // 打印字串

    let name = "haifeng";
    println!("打印变量值: hello {}!", name); // 打印变量

    println!("指定usize: hello {0:1$}!", name, 12); // 打印变量

    println!(
        "按位置序号打印: hello {0}, hi {0}, good {1}!",
        name, "morning"
    ); // 按位置打印

    println!(
        "按参数名打印: \nmail from {mail}, to {to}, subject:{subject}, date:{date}.",
        mail = "hubert28@qq.com",
        to = "abc@qq.com",
        subject = "测试邮件",
        date = "20230101",
    ); // 参数名打印

    let i = 123;
    println!("十进制制:{0}, 16进制:{0:X}, 八进制:{0:o}, 二进制:{0:b}", i); // 指定进制

    let f = 123.456789;
    println!("小数:{0:.3} {0:.1$}(1参数指定小数位数)", f, 2);

    println!("右对齐:{i:>8}, 左对齐:{i:<8}, 前置0:{i:>08}, 居中:{i:^8}."); // 对齐&前置

    let fmt = format!("右对齐:{i:>8}, 左对齐:{i:<8}, 前置0:{i:>08}."); // 对齐&前置 => format! 给变量
    println!("{fmt}");

    let pi = 3.1415926;
    println!("{pi:.3}");

    // ======= 练习 ===========
    // 创建一个包含单个 `i32` 的结构体（structure）。命名为 `Structure`。
    #[allow(dead_code)]
    #[derive(Debug)]
    struct Structure(i32);

    // 但是像结构体这样的自定义类型需要更复杂的方式来处理。
    // 下面语句无法运行。
    println!("This struct `{:?}` print...", Structure(3));
    // 改正 ^ 注释掉此行

    // ============= 美化打印 ===============
    #[allow(dead_code)] // 允许访问不到的字段存在, 而不报警.
    #[derive(Debug)]
    struct Person<'a> {
        name: &'a str,
        age: u8,
    }

    let name = "Peter";
    let age = 27;
    let peter = Person { name, age };

    // 美化打印
    println!("Person struct :\n{:#?}", peter);
}
